package org.example.sword2offer.primary;

/**
 * @author: lynn
 * @Descript:不用加减乘除做加法
 * @date: 2021/3/22 19:56
 * @version: 1.0
 */
public class Q48_Add {
    public static void main(String[] args) {
        System.out.println(doAdd(5,7));
    }
    //我们可以将两数的二进制表示写出来，然后按位与得出进位信息、按位或得出非进位信息，
    // 如果进位信息不为0，则循环计算直到进位信息为0，此时异或信息就是两数之和
    public static int doAdd(int num1,int num2){

        if(num1 == 0 || num2 == 0){
            return num1 == 0 ? num2 : num1;
        }
        //一个按位与，一个异或，然后与的那位<<1
        int and = 0, xor = 0;
        do{
            and = num1 & num2;//进位信息
            xor = num1 ^ num2;//非进位信息
            num1 = and << 1;
            num2 = xor;
        }while(and != 0);

        return xor;
    }
}
